/** 
 * @main Plik z definicjami interfejsu ObiektDyskretny.
 * @file    dyskretny.cpp
 * @author  Grzegorz Sejnota
 *
 * @created on 23 grudzien 2008, 13:41
 * @version 0.0001
 */

#include "dyskretny.h"
#include <exception>
#include <iostream>
#include <fstream>
using namespace std;


//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++ POCZĄTEK [interfejsu ObiektDyskretny] +++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//======= funkcja wirtualna symuluj ============================================
/**
 * Funkcja symulujaca obiekt dyskretny - obliczajaca wyjscie z obiektu na 
 * podstawie obecnego stanu wejscia u. 
 *      @param u - skalarne wejscie obiektu
 *      @return wyjscie z obiektu
 */
/*
double ObiektDyskretny::symuluj(double u){
}*/
    
//======= funkcja wirtualna symuluj ============================================
/**
 * Funkcja symulujaca obiekt dyskretny - obliczajaca wektor wyjscia z obiektu 
 * na podstawie wektora wejść. 
 *      @param u - wektor wejscia obiektu
 *      @return wektor wyjscie z obiektu 
 */
/*
vector<double> ObiektDyskretny::symuluj( const vector<double> & u){
}*/
    
//======= funkcja wirtualna wypiszInfo =========================================
/**
 * Funkcja wypisujaca informacje o obiekcie dyskretnym. Implementacje funkcji 
 * powinna wypisywac nazwe, typ oraz parametry obiektu dyskretnego.
 */
void ObiektDyskretny::wypiszInfo() const{
}

//======= funkcja wirtualna wypiszInfo =========================================
/**
 * Funkcja pobierajaca nazwe obiektu dyskretnego.
 */
/*
string ObiektDyskretny::pobierzNazwe() const{
}*/

//======= funkcja wirtualna zerujPamiec ========================================
/**
 * Funkcja zerujaca pamiec obiektu dyskretnego.
 */
void ObiektDyskretny::zerujPamiec() {
}
//------------------------------------------------------------------------------
//-------------- KONIEC [interfejsu ObiektDyskretny] ---------------------------
//------------------------------------------------------------------------------


//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++ POCZĄTEK [funckcji pomocniczych] ++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//======= funkcja wczytajWymuszenie ============================================
/**
 * Funkcja wczytujaca vector wymuszen z pliku ze sciezki podanej w argumencie.
 *
 *      @param sciezka - sciezka do pliku z wymuszeniami
 *      @return wektor wczytanych wymuszen
 */
vector<double> wczytajWymuszenie( string sciezka ){
    vector<double> wektorWymuszen;
    double u;
    // -------- otwarcie pliku -------------------------------------------------
    ifstream plikDoOdczytu;
    plikDoOdczytu.open(sciezka.c_str()); //otwarcie pliku
    if (!plikDoOdczytu) {   //blad otwarcia - wyrzuc wyjatek
        throw WyjatekPliku("Nie mozna otworzyc pliku do odczytu");
    }
    // -------- czytanie z pliku -----------------------------------------------
    while (!plikDoOdczytu.eof()) {  //dopoki nie ma konca pliku
        plikDoOdczytu>>u;   //sczytuj kolejne wartosci
        if (plikDoOdczytu) {    //bez bledu konwersji
            wektorWymuszen.push_back(u);  //wczytaj do wektora wymuszen
        }else { //blad konwersji
            cout << "blad" << endl;
            plikDoOdczytu.close();
            throw WyjatekPliku("Blad danych");
        }
    }
    plikDoOdczytu.close();
    return wektorWymuszen;
}

//======= funkcja zapiszWyjscia ================================================
/**
 * Funkcja zapisujaca wektor wynikow symulacji do pliku o podanej sciezce.
 *
 *      @param sciezka - sciezka do pliku, w ktorym ma zostac zapisany wynik
 *      @return wektor wczytanych wymuszen
 */
void zapiszWyjscie( const vector<double> & wektorWyjsc, string sciezka ){
    // -------- otwarcie pliku -------------------------------------------------
    ofstream plikDoZapisu;
    plikDoZapisu.open(sciezka.c_str()); //otwarcie pliku
    if (!plikDoZapisu) {   //blad otwarcia - wyrzuc wyjatek
        throw WyjatekPliku("Nie mozna otworzyc pliku do zapisu");
    }
    // -------- zapisanie wektora wyjsc do pliku -------------------------------
    for(int i=0; i<wektorWyjsc.size(); i++){
        plikDoZapisu<<wektorWyjsc.at(i)<<endl;
    }
    plikDoZapisu.close();
}

//======= funkcja przeprowadzSymulacje =========================================
/**
 * Funkcja przeprowadzajaca symulacje obiektu dyskretnego dziedziczacego interfejs
 * ObiektDyskretny na podstawie otrzymanego wektora wymuszen. Funkcja zapisuje wyniki 
 * symulacji - wejscia oraz wyjscia z obiektu do plikow z nazwa obiektu, w nastepujacy sposob:
 *      
 *      plik z wejsciami - NazwaObiektu_u.txt<br>
 *      plik z wyjsciami - NazwaObiektu_y.txt
 *      
 *      @param obiektArmax - referencja do obiektu, dla ktorego zostanie przeprowadzona symulacja
 *      @param wektorWymuszen - referencja do wektora wymuszen
 *      @return <code>true</code> - jesli symulacja zakonczyla sie prawidlowo<br>
 *              <code>false</code> - w przeciwnym wypadku
 */
bool przeprowadzSymulacje( ObiektDyskretny * obiektDyskretny, 
                           const vector<double> & wektorWejsc){
    vector<double> wektorWyjsc;
    cout<<endl<<"Przeprowadzam symulacja obiektu dyskretnego "<<obiektDyskretny->pobierzNazwe()<<endl;
    obiektDyskretny->wypiszInfo();
    // ------- utworzenie nazw plikow do zapisu --------------------------------
    string sciezkaWyjscia = obiektDyskretny->pobierzNazwe().append("_y.txt"),
           sciezkaWejscia = obiektDyskretny->pobierzNazwe().append("_u.txt");
    
    // ------- symulacja -------------------------------------------------------
    obiektDyskretny->zerujPamiec(); //wyzerowanie pamieci obiektu
    //wektorWyjsc = obiektDyskretny->symuluj(wektorWejsc);
    
    // ------- zapis wynikow do plikow -----------------------------------------
    try{
        zapiszWyjscie(wektorWyjsc, sciezkaWyjscia);
        zapiszWyjscie(wektorWejsc, sciezkaWejscia);
    }catch(WyjatekPliku e){
        cout<< "Blad w obsludze pliku. Nie zapisano dzialania symulacji"<<endl;
        cout<<"typ bledu: "<<e.pobierzBlad()<<endl;
        return false;
    }
    return true;
}
//------------------------------------------------------------------------------
//-------------- KONIEC [funckcji pomocniczych] --------------------------------
//------------------------------------------------------------------------------

